﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//int main()
//{
//	//逗号表达式特点：从左到右依次执行。整个表达式的结果是最后一个表达式的结果。
//	//逗号表达式中的每个表达式都要计算，前面的表达式有可能影响最后一个表达式
//	int a = 1;
//	int b = 2;
//	int c = (a > b, a = b + 10, a, b = a + 1);//逗号表达式,整个表达式
//	
//	printf("c = %d\n", c);// c = 13
// 
// 伪代码
// a = get_val();
	//count_val(a);
	//while (a > 0)
	//{
	//	//业务处理
	//	//...
	//	a = get_val();
	//	count_val(a);
	//}
	//如果使⽤逗号表达式，改写：
	//while (a = get_val(), count_val(a), a > 0)
	//{
	//	//业务处理
	//}
	//	return 0;
//}


//int main()
//{
//	int arr[10] = { 0 };
 // //操作数：⼀个数组名 + ⼀个索引值(下标)
 // // [ ] 的两个操作数时arr 和 5
//	arr[5] = 6;// [ ]下标引用操作符
//	printf("arr[5] = %d\n", arr[5]);
//
//	return 0;
//}



//void test()
//{
//	printf("hhh\n");
//}
//int Add(int x, int y)
//{
//	return x + y;
//}
// 
//函数在调用的时候，函数名后边的括号调用操作符
//() - 操作数是：函数名，参数
//函数调用操作符，最少有1个操作数 - 函数名
// 
//int main()
//{
//	int t = Add(2, 3);
//	printf("t = %d\n", t);
//	test();
//	printf("hehe\n");
//	printf("%d\n", 100);
//	return 0;
//}


//声明一个学生类型
//学生：名字，性别，年龄，学号
//		名字 - 字符串 - 字符数组
//		性别 - 字符串 - 字符数组
//		年龄 - 整数
//		学号 - 字符串 - 字符数组

//注意：结构体中不能没有成员
//struct Student
//{
//	//成员
//	char name[20];
//	char sex[10];
//	int age;
//	char id[12];//要预留一个空间放置\0
//}s5,s6,s7;//s5,s6,s7 都是结构体变量（全局）
//
////全局变量
//struct Student s4;
//
//int main()
//{
//	//局部变量
//	struct Student s1;
//	struct Student s2;
//	struct Student s3;
//	return 0;
//}



//struct Point
//{
//	int x;
//	int y;
//}p3 = {0, 0}, p4 = {4, 1};
//
//struct Point p2 = { 6,8 };
//
////数组中存放多个元素，使用{ } 初始化
////结构体中存放多个成员，使用{ }初始化
//int main()
//{
//	struct Point p1 = { 4.5 };
//	return 0;
//}


//struct Student
//{
//	//成员
//	char name[20];
//	char sex[10];
//	int age;
//	char id[12];//要预留一个空间放置\0
//};
//
//struct Node
//{
//	int data;
//	struct Point p;
//	struct Node* next;
//};
//int main()
//{
//		struct Point p1 = { 4.5 };
//	struct Student s1 = { "张三","男",19,"2024022200" };
//	struct Student s2 = { .age = 20 ,.id = "2024022203",.name = "李四",.sex = "女" };
//
//	struct Node n1 = { 200, {20,30},NULL };
//
//	//对年龄重新赋值  如果该变量不是数组则变量前+&
//	scanf("%d", & (s1.age));//直接访问成员变量
//	printf("%s %s %d %s\n", s1.name,s1.sex,s1.age,s1.id);
//	//结构体变量.结构体成员
//	return 0;
//}


//表达式求值
//截断
//char是signed char？ 还是unsigned char？
//int main()
//{
//	char a = 5;
//	//00000000000000000000000000000101
//	// 00000101 - a
//	//
//	char b = 125;
//	//00000000000000000000000001111101
//	// 01111101 - b
//	// 
//	//a和b的值被提升为普通整型，然后再执⾏加法运算。
//	//加法运算完成之后，结果将被截断，然后再存储于c中。
//	char c = a + b;
//	// 00000000000000000000000000000101 - a
//	// 00000000000000000000000001111101 - b
//	// 00000000000000000000000010000010 
//	// 10000010 - c
//	//a 和 b都是char类型，长度是小于int类型的长度的
//	// 在计算的时候，默认就会发生整型提升
//	//
//	//符合进行整体提升？
//	//1.有符号整数提升是按照变量的数据类型的符号位来提升的
//	//2.无符号整数提升，高位补0
//
//	printf("c = %c\n", c);//-126
//	//1111111111111111111111111110000010 - 补码
//	//1000000000000000000000000001111101 - 取反
//	//1000000000000000000000000001111110 - -126
//	//%d - 按照有符号整数的形式打印
//	return 0;
//}


//表达式3
//int main()
//{
//	int i = 10;
//	i = i-- - --i * (i = -3) * i++ + ++i;
//	printf("i = %d\n", i);//4
//	return 0;
//}


//int fun()
//{
//	static int count = 1;
//	return ++count;
//}
//int main()
//{
//	int answer;
//	answer = fun() - fun() * fun();
//	printf("%d\n", answer);//输出多少？ -10
//	return 0;
//}


//计算的代码要有唯一确定路径，否则避免写
//下列代码是有歧义的，避免下列这种写法
//int main()
//{
//	int i = 1;
//	int ret = (++i) + (++i) + (++i);// 4 + 4 + 4
//	printf("%d\n", ret);// 12
//	printf("%d\n", i);// 1
//	return 0;
//}


//指针
int main()
{
	int a = 25;//变量的本质是在内存中开辟一块空间
	//&a;  & - 取地址操作符
	//%p -- 是专门用来打印地址的 -- 其实是以16进制的形式进行打印的
	printf("%p\n", &a);//&a取出的是a所占4个字节中地址较小的字节的地址
	printf("%x\n", &a);//这种形式打印，如果高位有0会被省略掉
	return 0;
}